﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
 * 继承 就是将共同的属性或者方法抽离到父类的过程，这个思维称为面向对象
 * 访问修饰符
 * 
 * 是否继承多个 继承 ： 不支持
 * 是否支持多重继承 ; 支持  比如 孙子可以使用爷爷的方法 属性。
 * 
 * 封装： 将实现细节，通过接口的形式 暴露给第三方 而不需要关心具体实现的方法细节
 * 
 * virtual   虚函数
 * 
 * override 用于覆盖虚函数
 *
 *覆盖：发生在 继承关系中 通过 virtual 和 override 函数名和函数参数名是一样的
 *
 *重载：发生在任何关系中 只要保证函数名字一样，带不带参数都可以 参数不一致 即可实现重载
 *this:指的是访问当前类的成员
 *base: 指的是访问基类的成员
 *
 *静态多态（编译时） c#中 分别为函数重载 和 运算符重载
 *
 *运行时多态 
 */
public class DuoChong : rectangle
{
    public DuoChong()
    {
        int bbb = aaaa;
        Debug.Log("DuoChong().bbb:"+bbb);
    }
}
public class Polygon//基类 、父类
{
    
    public int Width;
    public int Height;
    public string name;
    public string color;
    private int aaa;
    protected int aaaa=40;
    public int Area; 
    public void ShowBaseinfo()//
    {
        Debug.Log("name:"+name+"Coloe:"+color);
        //Debug.Log("面积：" + Width * Height);
    }
    public virtual void CalcArea()//计算面积  virtual代表虚函数  子类可以覆盖其
                                  //实现新的方法，如果子类不覆盖，将使用父类的同名函数
    {

    }
    public void ShowFunc()
    {

    }
    public void  ShowFunc(int a)
    {

    }

    public virtual void Show()
    {
        Debug.Log("Polygon.Show");
    }
}
public class rectangle : Polygon//派生类 子类 
{
    float fff;
    public rectangle()
    {
        
        int bbb = aaaa;
    }
    public override void CalcArea()//override 代表覆盖 
    {
        Area = Width * Height;
    }
    public void ShowFunc(string a)
    {

    }
    public override void Show()
    {
        Debug.Log("rectangle.Show");
    }
}
public class triangle : Polygon//派生类 子类 
{
    public triangle()
    {
        
    }
    public override void CalcArea()
    {
        Area = (Width * Height)/2;
    }
    public override void Show()
    {
        Debug.Log("triangle.Show");
    }
}
public class Extend : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        rectangle rectangle = new rectangle();
        rectangle.name = "长方形";
        rectangle.Height = 4;
        rectangle.Width = 3;
        rectangle.ShowBaseinfo();
        rectangle.CalcArea();

       
        rectangle.ShowFunc(12);
        
        Debug.Log(rectangle.name+rectangle.Area);

        triangle triangle = new triangle();
        triangle.name = "三角形";
        triangle.Height = 4;
        triangle.Width = 3;
        triangle.ShowBaseinfo();
        triangle.CalcArea();
        
        Debug.Log(triangle.name + triangle.Area);


        DuoChong duoChong = new DuoChong();

        //运行时多态  运行时无法确认调用哪个方法 只有在运行时才能确定的方法 这种行为叫做运行时多态
        Polygon baseParent1 = rectangle;
        Polygon baseParent2 = triangle;
        baseParent1.Show();//运行时多态 F12跳转到的是基类的SHow方法，其实执行的子类的show方法
        baseParent2.Show();
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
